/**
 * @file logproxy.h
 * @brief Definizione dell'interfaccia proxy per il logging.
 *
 * Vengono definite principalmente 4 tipologie di logging:
 * - simple semplice registrazione di un messaggio
 * - level registrazione differenziata per livello
 * - named registrazione differenziata per nome dell'entità: ovvero posizione identificativa del codice
 * - named & level: utilizzo di registrazione differenziata per livello e per nome
 *
 * @date Mar 3, 2012
 * @author Francesco Corvino
 */

#ifndef LOGPROXY_H_
#define LOGPROXY_H_

#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdbool.h>
#include "../MemObj/dynArray.h"

#define LOG_INFO_LEVEL 0
#define LOG_DEBUG_LEVEL 1
#define LOG_ERROR_LEVEL 5

#define LOG_MAXLENGHT_MSG BUFSIZ

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni di settaggio delle proprietà del logging /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

void Logging_setLoggingOut(void (*fn)(char*msg));

void Logging_setLoggingNameSelector(int (*fn)(char*name));

void Logging_setLoggingLevelSelector(int (*fn)(int level));

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per invocare il logging //////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

void log_simple(char* format,...);

void log_level(int level, char * format,...);

void log_named(char *name, char *format,...);

void log_namedlevel(char *name, int level, char *format,...);

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per il logger di default /////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

/**
 * @brief Massima dimensione stabilita per il nome da assegnare durante il logging.
 */
#define DEFLOG_MAX_NAME 50

void defLog_init();

void defLog_end();

int defLog_level(int level);

int defLog_name(char *name);

void defLog_outputFn(char*h);

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni getter and setter delle configurazioni del default Logger ////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

DynArray* getLevelsLogged();

DynArray* getNamesLogged();

void setUsedLogic(bool logic);

bool getUsedLogic();

#endif /* LOGPROXY_H_ */
